#pragma once

#include <QObject>
#include <QVariantMap>
#include <QPointF>
#include <QColor>
#include <QTime>
#include <QDebug>
#include <cmath>

class CustomChart : public QObject{
    Q_OBJECT

public:

    enum enCurveType{
        SCATTER,
        LINE,
        SPLINE,
    };
    struct stCurve{

        QVector<QPointF>    pointList;              // 原始曲线点
        QVector<QPointF>    normPointList;          // 归一化后的曲线点
        QVector<QPointF>    bezierPointList;        // 归一化后的贝塞尔点


        enCurveType     curveType;
        int             lineWidth;
        QColor          color;
        qreal           minX;
        qreal           minY;
        qreal           maxX;
        qreal           maxY;

    };

    CustomChart();

    // QML接口
    Q_INVOKABLE QVariantMap    getCurveInfo();

    void appendCurve(QString name, QVector<QPointF> pointList, QColor color, int lineWidth, enCurveType type=SPLINE);

    Q_INVOKABLE void refresh();         // 重新计算坐标轴范围、归一化、贝塞尔曲线，并通知前端数据可更新

signals:
    void sigRefresh();          // 通知前端图表有新数据需要刷新


private:

    // 参数计算
    void    calculate();
    void    calRange();
    void    calNorm();
    void    calBezier();


    // 方法
    static double    calCeilRange(double value);     // 坐标轴的最大值向上取整




    QMap<QString, stCurve>   _curveList;


    bool    _isFixedMinX = false;
    bool    _isFixedMinY = false;
    bool    _isFixedMaxX = false;
    bool    _isFixedMaxY = false;

    qreal   _defaultMaxX = 1;
    qreal   _defaultMinX = 0;
    qreal   _defaultMaxY = 1;
    qreal   _defaultMinY = 0;

    qreal   _fixedMinX = 1;
    qreal   _fixedMinY = 1;
    qreal   _fixedMaxX = 2;
    qreal   _fixedMaxY = 2;

    qreal   _maxX;
    qreal   _minX;
    qreal   _minY;
    qreal   _maxY;

};
